﻿// 272. 最长公共上升子序列.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>

using namespace std;


/*
https://www.acwing.com/problem/content/274/

熊大妈的奶牛在小沐沐的熏陶下开始研究信息题目。

小沐沐先让奶牛研究了最长上升子序列，再让他们研究了最长公共子序列，现在又让他们研究最长公共上升子序列了。

小沐沐说，对于两个数列 A 和 B，如果它们都包含一段位置不一定连续的数，且数值是严格递增的，那么称这一段数是两个数列的公共上升子序列，
而所有的公共上升子序列中最长的就是最长公共上升子序列了。

奶牛半懂不懂，小沐沐要你来告诉奶牛什么是最长公共上升子序列。

不过，只要告诉奶牛它的长度就可以了。

数列 A 和 B 的长度均不超过 3000。

输入格式
第一行包含一个整数 N，表示数列 A，B 的长度。

第二行包含 N 个整数，表示数列 A。

第三行包含 N 个整数，表示数列 B。

输出格式
输出一个整数，表示最长公共上升子序列的长度。

数据范围
1≤N≤3000,序列中的数字均不超过 231−1。

输入样例：
4
2 2 1 3
2 1 2 3


10
1 5 3 6 3 2 7 3 6 2
9 6 2 3 1 5 3 3 6 1

3

输出样例：
2
*/

const int N = 3010;
int A[N], B[N];
int dp[N][N];
int n;

void solve() {
	/*for (int i = 1; i <= n; i++) {
		int v = A[i];
		for (int j = 1; j <= n; j++) {
			dp[i][j] = dp[i - 1][j];
			if (B[j] == v) {
				for (int k = 0; k < j; k++) {
					if(v > B[k])
						dp[i][j] = max(dp[i][j], dp[i - 1][k] + 1);
				}
			}
		}
	}*/

	for (int i = 1; i <= n; i++) {
		int maxV = 1;
		for (int j = 1; j <= n; j++) {
			dp[i][j] = dp[i - 1][j];
			if (A[i] == B[j]) dp[i][j] = max(dp[i][j], maxV);
			if (A[i] > B[j]) maxV = max(maxV, dp[i - 1][j] + 1);
		}
	}


	int ans = 0;
	for (int i = 1; i <= n; i++) {
		ans = max(ans, dp[n][i]);
	}
	cout << ans << endl;
}

int main()
{
	cin >> n;

	for (int i = 1; i <= n; i++) cin >> A[i];
	for (int i = 1; i <= n; i++) cin >> B[i];

	solve();

	return 0;
}

 